Lazy Loading এবং Eager Loading হল JPA (Java Persistence API)-এর দুটি গুরুত্বপূর্ণ ধারণা, যা অবজেক্ট রিলেশন ম্যানেজমেন্টের (ORM) সময় ডেটা লোড করার কৌশল নিয়ে কাজ করে। এগুলি স্প্রিং বুটের মধ্যে JPA ব্যবহার করার সময়, সম্পর্কিত অবজেক্টগুলির (যেমন, এক্সটেনশন, অ্যাসোসিয়েশন) ডেটা কিভাবে লোড হবে তা নির্ধারণ করে।
- Lazy Loading: ডেটা শুধুমাত্র যখন প্রয়োজন হয় তখন লোড করা হয়।
- Eager Loading: ডেটা প্রাথমিকভাবে লোড করা হয়, 즉 সবকিছু একবারেই লোড হয়।
1. Lazy Loading
Lazy Loading হল একটি কৌশল যেখানে সম্পর্কিত ডেটা বা অবজেক্টগুলি তখনই লোড হয় যখন সেগুলি আসলেই প্রয়োজন হয়। উদাহরণস্বরূপ, একটি ক্লাসে সম্পর্কিত একটি অ্যাসোসিয়েশন (যেমন, একাধিক অবজেক্টের লিস্ট) যদি Lazy Loading এর মাধ্যমে লোড করা হয়, তবে যখন আপনি ওই সম্পর্কিত ডেটাতে অ্যাক্সেস করবেন, তখন ডেটাটি লোড হবে। এর ফলে অ্যাপ্লিকেশন স্টার্টআপ সময় এবং মেমরি ব্যবহারের মধ্যে উন্নতি হয়, কারণ ডেটার সবকিছু একসাথে লোড না করে প্রয়োজন অনুযায়ী লোড করা হয়।
Lazy Loading এর সুবিধা:
- পারফরম্যান্স অপটিমাইজেশন: শুধু যখন প্রয়োজন হয় তখনই সম্পর্কিত ডেটা লোড হয়, যা প্রাথমিক লোড সময় কমায়।
- কম মেমরি ব্যবহার: অতিরিক্ত ডেটা লোড করা না হলে মেমরি খরচ কম থাকে।
Lazy Loading এর উদাহরণ:
@Entity
public class Department {
@Id
private Long id;
private String name;
@OneToMany(fetch = FetchType.LAZY)
private List<Employee> employees;
// Getters and Setters
}
@Entity
public class Employee {
@Id
private Long id;
private String name;
@ManyToOne(fetch = FetchType.LAZY)
private Department department;
// Getters and Setters
}
এখানে, Department Entity এর employees ফিল্ডটি Lazy Loading এর মাধ্যমে লোড হবে, অর্থাৎ শুধুমাত্র যখন আপনি employees লিস্টে অ্যাক্সেস করবেন, তখন ডেটাটি ডাটাবেস থেকে লোড হবে।
Lazy Loading এর সমস্যা:
- N+1 Query Problem: যখন একাধিক সম্পর্কিত ডেটা লোড করতে হয় এবং প্রতিটি ডেটার জন্য নতুন কুয়েরি চালানো হয়, তখন এটি N+1 Query Problem তৈরি করতে পারে, যা পারফরম্যান্সে সমস্যা সৃষ্টি করতে পারে।
2. Eager Loading
Eager Loading হল একটি কৌশল যেখানে সম্পর্কিত সমস্ত ডেটা বা অবজেক্ট প্রাথমিকভাবে লোড হয়ে যায়, এমনকি যদি তা অ্যাক্সেস করা না হয়। এটি ডেটার লোডিং নিশ্চিত করে, এবং তখনই সম্পর্কিত সমস্ত ডেটা ডাটাবেস থেকে লোড হয়ে যায় যখন প্যারেন্ট অবজেক্টটি লোড হয়।
Eager Loading এর সুবিধা:
- সাম্প্রতিক ডেটা পাওয়া: সমস্ত সম্পর্কিত ডেটা একসাথে লোড হওয়ায় পরবর্তী সময়ে ডেটা অ্যাক্সেস করতে অপেক্ষা করতে হয় না।
- ডেটার এক্সেস দ্রুত: যখন সমস্ত ডেটা লোড হয়ে যায়, তখন ডেটার এক্সেস দ্রুত হয়।
Eager Loading এর উদাহরণ:
@Entity
public class Department {
@Id
private Long id;
private String name;
@OneToMany(fetch = FetchType.EAGER)
private List<Employee> employees;
// Getters and Setters
}
@Entity
public class Employee {
@Id
private Long id;
private String name;
@ManyToOne(fetch = FetchType.EAGER)
private Department department;
// Getters and Setters
}
এখানে, Department Entity এর employees ফিল্ডটি Eager Loading এর মাধ্যমে লোড হবে, অর্থাৎ যখন আপনি Department অবজেক্টটি লোড করবেন, তখন employees লিস্টটি সমস্ত ডেটা সহ লোড হয়ে যাবে।
Lazy Loading vs Eager Loading
| Criteria | Lazy Loading | Eager Loading |
|---|---|---|
| Performance | Initially faster; loads data when needed | Initially slower; loads all related data |
| Memory Usage | Saves memory as data is loaded only when required | May consume more memory as all related data is loaded upfront |
| Query Execution | Potential N+1 query problem | Fewer queries, but may load unnecessary data |
| Use Case | When related data is not always needed | When related data is always needed |
| Fetch Type | FetchType.LAZY | FetchType.EAGER |
সারাংশ
- Lazy Loading ব্যবহার করলে সম্পর্কিত ডেটা তখনই লোড হয় যখন এটি সত্যিকারভাবে প্রয়োজন হয়, ফলে পারফরম্যান্স উন্নত হয় এবং মেমরি সাশ্রয়ী হয়।
- Eager Loading ব্যবহার করলে সম্পর্কিত সমস্ত ডেটা প্রাথমিকভাবে লোড হয়ে যায়, যা দ্রুত এক্সেসের সুবিধা দেয়, তবে এটি অনেক বেশি মেমরি ব্যবহার করতে পারে এবং পারফরম্যান্স কমাতে পারে, বিশেষ করে যখন সম্পর্কিত ডেটার পরিমাণ বেশি হয়।
স্প্রিং বুট জেপিএ-তে, আপনি Lazy এবং Eager লোডিং কৌশল ব্যবহার করে আপনার অ্যাপ্লিকেশনের পারফরম্যান্স অপটিমাইজ করতে পারেন, তবে প্রতিটি কৌশলের সুবিধা এবং অসুবিধা বুঝে তাদের সঠিকভাবে ব্যবহার করা উচিত।
Read more